/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.edu.eam.clinica.logica.bo;

import co.edu.eam.persitencia.dao.Interfaz.IDAOConsulta;
import co.edu.eam.persitencia.dao.Interfaz.IDAOFuncionario;
import co.edu.eam.persitencia.dao.Interfaz.IDAOPaciente;
import co.edu.eam.persitencia.dao.implementacion.DAOConsulta;
import co.edu.eam.persitencia.entidades.Consulta;
import co.edu.eam.persitencia.entidades.DetalleFormulaMedica;
import co.edu.eam.persitencia.entidades.FormulaMedica;
import co.edu.eam.persitencia.entidades.Medico;
import co.edu.eam.persitencia.entidades.OrdenMedica;
import co.edu.eam.persitencia.entidades.Paciente;
import co.edu.eam.persitencia.entidades.Procedimiento;
import co.edu.eam.persitencia.entidades.Remision;
import co.edu.eam.persitencia.enumeraciones.EstadoConsultaEnum;
import co.edu.eam.persitencia.enumeraciones.MotivoConsultaEnum;
import co.edu.eam.persitencia.enumeraciones.TipoProcedimietoEnum;
import co.edu.eam.persitencia.utilidades.FactoryEntityManager;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.swing.JOptionPane;

/**
 *
 * @author Erika
 */
public class BOConsulta {
    
     static EntityManager fabrica = FactoryEntityManager.getEm();
    IDAOConsulta DAOConsulta;
    IDAOPaciente daoPaciente;
    IDAOFuncionario dAOFuncionario;
    
     public BOConsulta() {
        DAOConsulta= new DAOConsulta(fabrica);
    }
     /**
      * metodo en el que se implementa el daoconsulta y con el cual se crea la consulta
      * @param paciente  de la consulta
      * @param fecha de la consulta
      * @param motivo de la consulta
      * @param medico de la consulta
      * @throws Exception 
      */
     public void crearConsulta(Paciente paciente, Date fecha,MotivoConsultaEnum motivo,Medico medico) throws Exception{
        
         Paciente paci=daoPaciente.buscarPaciente(paciente.getDocumento());
         Medico medi=dAOFuncionario.buscarMedico(medico.getDocumento());
         
         if(paci!=null){
             if(medi!=null){
                   Consulta consulta=new Consulta(fecha, paciente, medico, motivo);
                    DAOConsulta.crearConsulta(consulta);
                    consulta.setEstado(EstadoConsultaEnum.EN_ESPERA);
                    DAOConsulta.editarConsulta(consulta);
             }else{
                JOptionPane.showMessageDialog(null,"el medico no existe"); 
             }
         }else{
             JOptionPane.showMessageDialog(null,"el paciente no existe");
         }
     }
     /**
      * metodo en el que se implementa el daoconsulta y con el cual se elimina la consulta
      * @param id de la consulta
      * @throws Exception  de la consulta
      */
     public void cancelarCita(long id)throws Exception{
       Consulta con=  DAOConsulta.buscarConsulta(id);
         if(con!=null){
             con.setEstado(EstadoConsultaEnum.CANCELADA);
             DAOConsulta.editarConsulta(con);
         }else{
             JOptionPane.showMessageDialog(null,"la consultad no existe");
         }
     }
     /**
      * metodo para aplazar la consulta de un paciente 
      * @param medico de la consulta
      * @param paciente de la consulta
      * @throws Exception 
      */
     public void aplazarCitaMedico(Medico medico,Paciente paciente)throws Exception{
         Medico medi=dAOFuncionario.buscarMedico(medico.getDocumento()); 
         Paciente paci=daoPaciente.buscarPaciente(paciente.getDocumento());
         
         if(paci!=null){
             if(medi!=null){
                   List<Consulta> lista=DAOConsulta.listarConsultaPaciente(paci.getDocumento());
                   for (int i = 0; i < lista.size(); i++) {
                     if(lista.get(i).getEstado().equals(EstadoConsultaEnum.EN_ESPERA)){
                         
                         lista.get(i).setMedico(medico);
                     }else{
                         JOptionPane.showMessageDialog(null,"el paciente no tiene consultas en espera"); 
                     }
                 }
             }else{
                JOptionPane.showMessageDialog(null,"el medico no existe"); 
             }
         }else{
             JOptionPane.showMessageDialog(null,"el paciente no existe");
         }
     }
     /**
      * metodo para una crear la orden medica 
      * @param orden objeto orden
      * @throws Exception 
      */
     public void crearOrdenMedica(OrdenMedica orden)throws Exception{
         
         OrdenMedica medica=DAOConsulta.buscarOrdenMedica(orden.getId());
         
         if (medica==null) {
              DAOConsulta.crearOrdenMedica(orden);
         } else {
             JOptionPane.showMessageDialog(null, "la orden medica ya existe");
         }
     }
     /**
      * metodo para crear una formula medica
      * @param formula objeto formula medica
      * @throws Exception 
      */
     public void crearFormulaMedica(FormulaMedica formula) throws Exception{
         FormulaMedica f=DAOConsulta.buscarFormulaMedica(formula.getId());
         if (f==null) {
             DAOConsulta.crearFormulaMedica(formula);
         } else {
             JOptionPane.showMessageDialog(null, "la formula medica ya existe");
         }
     }
     /**
      * metodo para crear una remision 
      * @param remision objeto remision
      * @throws Exception 
      */
     public void crearRemision(Remision remision)throws Exception{
         Remision rem=DAOConsulta.buscarRemision(remision.getId());
         if (rem==null) {
             DAOConsulta.crearRemision(remision);
         } else {
             JOptionPane.showMessageDialog(null, "la formula medica ya existe");
         }
     }
     /**
      * metodo para crear un detalle de formula medica
      * @param detalle
      * @throws Exception 
      */
     public void crearDetalleFormulaMedica(DetalleFormulaMedica detalle)throws Exception{
         DetalleFormulaMedica dFM=DAOConsulta.buscarDetalleFormulaMedica(detalle.getId());
         if (dFM==null) {
             DAOConsulta.crearDetalleFormulaMedica(detalle);
         } else {
             JOptionPane.showMessageDialog(null, "el detalle de formula medica ya existe");
         }
     }
     /**
      * metodo para listar las consultas por tipo de procedimiento
      * @param tipo es una enumeracion de tipo procedimiento
      * @return un lista de consultas deacuerdo con el tipo de procedimiento
      * @throws Exception 
      */
     public List<Consulta>listarConsulta_Procedimiento(TipoProcedimietoEnum tipo)throws Exception{
         return DAOConsulta.listarConsultasProcedimiento(tipo);
     }
/**
 * metodo para listar los procedimiento
 * @return una lista con todos los procedimiento
 * @throws Exception 
 */
    public List<Procedimiento> listarProcedimiento() throws Exception {
        return DAOConsulta.listar();
    }
/**
 * metodo para listar las consultas por paciente
 * @param documento del paciente
 * @return una lista con las consultas de un paciente
 * @throws Exception 
 */
    public List listarConsulta_paciente(String documento) throws Exception {
        return DAOConsulta.listarConsultaPaciente(documento);
    }
/**
 * metodo para buscar un consulta
 * @param id de la consulta
 * @return la consulta del id
 * @throws Exception 
 */
    public Consulta buscarConsulta(long id) throws Exception{
        Consulta con=DAOConsulta.buscarConsulta(id);
        return con;
    }
     public List<Remision> listarRemisionesEspecialidades(long id)throws Exception{
         return DAOConsulta.listarRemisionesEspecialidades(id);
     }
     
     public List<Consulta> listarFecha(Date fecha) throws Exception {
         return DAOConsulta.listarFecha(fecha);
     }
     
     public List<DetalleFormulaMedica> listarDetalleFormulamedica() throws Exception{
         return DAOConsulta.listarDetalleFormulamedica();
     }

    public void asignarCita(Consulta consul) throws Exception {
        Consulta con=DAOConsulta.buscarConsulta(consul.getId());
        if (con!=null) {
            con.setEstado(EstadoConsultaEnum.TOMADA);
        } else {
            JOptionPane.showMessageDialog(null, "la consulta no existe");
        }
    }
}
